package br.com.datasun.biblioteca.ui.controller;

import java.awt.event.MouseEvent;
import java.util.List;

import javax.swing.JOptionPane;

import br.com.datasun.biblioteca.delegate.CadastrosDelegate;
import br.com.datasun.biblioteca.delegate.ConsultasDelegate;
import br.com.datasun.biblioteca.entities.Assunto;
import br.com.datasun.biblioteca.entities.Categoria;
import br.com.datasun.biblioteca.exceptions.AssuntoJaExistenteException;
import br.com.datasun.biblioteca.exceptions.AssuntoSemNomeException;
import br.com.datasun.biblioteca.exceptions.BusinessException;
import br.com.datasun.biblioteca.exceptions.CategoriaJaExistenteException;
import br.com.datasun.biblioteca.exceptions.CategoriaSemNomeException;
import br.com.datasun.biblioteca.ui.CadastroAssuntosUI;
import br.com.datasun.biblioteca.ui.CadastroCategoriaUI;

public class CadastroCategoriaController implements ICRUDController{
	private CadastroCategoriaUI ui;
	private CadastrosDelegate cadastrosDelegate = new CadastrosDelegate();
	private ConsultasDelegate consultasDelegate = new ConsultasDelegate();
	
	public CadastroCategoriaController(CadastroCategoriaUI ui){
		this.ui = ui;
	}
	
	@Override
	public void btnSalvarEventHandler() {
		// TODO Auto-generated method stub
		gravarCategoria();
	}

	@Override
	public void btnFecharEventHandler() {
		// TODO Auto-generated method stub
		ui.limparFormulario();
		ui.editarCampos(false);
		UIController.mudarTela(TelaBiblioteca.MENU_CENTRAL_UI);		
	}

	@Override
	public void btnNovoEventHandler() {
		// TODO Auto-generated method stub
		ui.limparFormulario();
		ui.editarCampos(true);
		ui.requestFocusCampoAssunto();
		ui.setIsEditing(false);			
	}

	@Override
	public void btnLimparEventHandler() {
		// TODO Auto-generated method stub
		ui.limparFormulario();
		ui.editarCampos(false);
		ui.setIsEditing(false);
	}

	@Override
	public void excluirEventHandler() {
		// TODO Auto-generated method stub
		Categoria categoriaSelecionado = ui.getCategoriaSelecionado();
		if(categoriaSelecionado != null){
			try{
				cadastrosDelegate.excluirCategoria(categoriaSelecionado);
				ui.removerCategoria(categoriaSelecionado);
				ui.limparFormulario();
				ui.editarCampos(false);
				ui.setIsEditing(false);
			}catch (BusinessException e) {
				JOptionPane.showMessageDialog(ui,e.getMessage(), "Erro em operação de exclusão!", JOptionPane.ERROR_MESSAGE);
			}
		}else{
			JOptionPane.showMessageDialog(ui, "Por favor selecione uma categoria para excluir!", "Seleção de autor requerida!", JOptionPane.WARNING_MESSAGE);
		}		
	}

	@Override
	public void selecionarParaEdicaoEventHandler(MouseEvent event) {
		// TODO Auto-generated method stub
		int quantidadeDeCliques = event.getClickCount();
		if(quantidadeDeCliques >= 2){
			int linhaSelecionada = ui.getIndiceCategoriaSelecionado();
			Categoria categoriaAEditar = ui.getCategoria(linhaSelecionada);
			ui.setIsEditing(true); //diz que h� um registro em edi��o
			
			ui.carregarFormularioAPartirDe(categoriaAEditar);
			Categoria categoriaEmEdicao = copiarCategoria(categoriaAEditar);
			ui.setCategoriaEmEdicao(categoriaEmEdicao);
			ui.editarCampos(true);
			ui.requestFocusCampoAssunto();
		}else{
			int linhaSelecionada = ui.getIndiceCategoriaSelecionado();
			Categoria categoriaSelecionado = ui.getCategoria(linhaSelecionada);
			ui.setCategoriaSelecionado(categoriaSelecionado);
			ui.carregarFormularioAPartirDe(categoriaSelecionado);
		}		
	}

	@Override
	public void carregarDados() {
		// TODO Auto-generated method stub
		carregarAssuntos();
		List<Categoria> categorias = null;
		try {
			categorias = consultasDelegate.listarTodasCategorias();
			ui.setCategorias(categorias);
			ui.editarCampos(false);
		} catch (BusinessException e) {
			e.printStackTrace();
		}		
	}
	
	public Categoria copiarCategoria(Categoria categoria){
		Categoria result = null;
		if(categoria!= null){
			result = new Categoria();
			result.setId(categoria.getId());
			result.setNome(categoria.getNome());
			Assunto assunto;
			assunto = categoria.getAssunto();
			if (assunto != null){
				result.setAssunto(assunto);
			}
		}
		return result;
	}
	
	public void carregarAssuntos(){
		List<Assunto> assuntos;
		try{
			assuntos = consultasDelegate.listarTodosAssuntos();
			ui.setAssuntos(assuntos);
			ui.inicializarAssuntos();
		}catch (BusinessException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public void gravarCategoria() {
		try{			
			if (ui.isEditing()){
				Categoria categoriaEmEdicao = ui.getCategoriaEmEdicao();
				int indiceCategoriaSelecionado = ui.getIndiceCategoriaSelecionado();
				if (categoriaEmEdicao != null){
					categoriaEmEdicao.setNome(ui.getNomeCategoria());
					
					cadastrosDelegate.atualizarCategoria(categoriaEmEdicao);
					ui.atualizarCategoria(categoriaEmEdicao,indiceCategoriaSelecionado);					
						  
					ui.setIsEditing(false);
					ui.limparFormulario();
					ui.editarCampos(false);
					
					//ui.limparCorFundoCamposObrigatorios();
					ui.setCategoriaSelecionado(null);
					
				}else{
					JOptionPane.showMessageDialog(ui, "Por favor selecione em registro para editar!", "Seleção da categoria requerida!", JOptionPane.WARNING_MESSAGE);
				}
			}else{
				Categoria novaCategoria = new Categoria();						
				Assunto assunto = ui.getAssuntoSelecionado();
				novaCategoria.setNome(ui.getNomeCategoria());
				novaCategoria.setAssunto(assunto);
				
				novaCategoria = cadastrosDelegate.cadastrarCategoria(novaCategoria);
				ui.inserirCategoria(novaCategoria);
				ui.limparFormulario();
				ui.editarCampos(false);						   
				   															
			}
		}catch (CategoriaSemNomeException e) {
			
			ui.requestFocusCampoAssunto();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Atenção ::..", JOptionPane.WARNING_MESSAGE);					
		}catch (CategoriaJaExistenteException e) {
			ui.requestFocusCampoAssunto();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Atenção ::..", JOptionPane.WARNING_MESSAGE);
		}catch (BusinessException e){
			e.printStackTrace();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Erro ::..", JOptionPane.ERROR_MESSAGE);
		}		
	}

}
